'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _objectAssign = require('./objectAssign');

var _objectAssign2 = _interopRequireDefault(_objectAssign);

var _param = require('../form/param');

var _param2 = _interopRequireDefault(_param);

var _PromiseOld = require('../class/PromiseOld');

var _PromiseOld2 = _interopRequireDefault(_PromiseOld);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * ajax
 */
function ajax(option) {
    var opt = (0, _objectAssign2.default)({
        type: 'GET',
        async: true,
        data: '',
        dataType: 'json',
        jsonp: 'cb',
        processData: true,
        contentType: 'application/x-www-form-urlencoded;charset=utf-8',
        success: function success() {},
        error: function error() {}
    }, option);

    if (!opt.url) {
        throw new Error('url参数不能为空');
    }

    //promise
    var promise = new _PromiseOld2.default();

    var successCallback = function successCallback() {
        promise.resolve.apply(promise, arguments);
        opt.success.apply(opt, arguments);
    };
    var errorCallback = function errorCallback() {
        promise.reject.apply(promise, arguments);
        opt.error.apply(opt, arguments);
    };

    //序列化参数
    if (opt.processData && typeof opt.data !== 'string') {
        opt.data = (0, _param2.default)(opt.data);
    }

    if (opt.dataType == 'jsonp') {
        //全局作用域
        window.jsonpCallback = function (json) {
            successCallback(json);
            window.jsonpCallback = null;
        };
        var jsonpScript = document.createElement('script');
        jsonpScript.type = 'text/javascript';
        jsonpScript.src = opt.url + '?' + opt.jsonp + '=jsonpCallback' + (opt.data == '' ? '' : '&' + opt.data);
        var head = document.getElementsByTagName('head')[0];
        head.appendChild(jsonpScript);
        head.removeChild(jsonpScript);
    } else {
        var xhr;

        (function () {
            var response = function response(e) {
                if (xhr.readyState == 4) {
                    if (xhr.status == 200) {
                        successCallback(getResponseData(opt.dataType, xhr));
                    } else {
                        errorCallback(xhr.status, xhr.statusText, e);
                    }
                }
            };

            if (window.XMLHttpRequest) {
                // code for IE7+, Firefox, Chrome, Opera, Safari
                xhr = new XMLHttpRequest();
            } else {
                // code for IE6, IE5
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }

            //当使用 async=true 时，请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数
            if (opt.async) {
                xhr.onreadystatechange = function (e) {
                    response(e);
                };
            }

            switch (opt.type.toUpperCase()) {
                case 'GET':
                    xhr.open('GET', opt.url + (opt.data == '' ? '' : '?' + opt.data), opt.async);
                    setRequestHeader(xhr, opt);
                    xhr.send(null);
                    break;
                case 'POST':
                    xhr.open('POST', opt.url, opt.async);
                    //如果需要像 HTML 表单那样 POST 数据，请使用 setRequestHeader() 来添加 HTTP 头
                    setRequestHeader(xhr, opt);

                    //设置默认请求头
                    if (opt.contentType) {
                        xhr.setRequestHeader("Content-type", opt.contentType);
                    }

                    xhr.send(opt.data);
                    break;
            }

            //当您使用 async=false 时，请不要编写 onreadystatechange 函数 - 把代码放到 send() 语句后面即可
            if (!opt.async) {
                response();
            }
        })();
    }

    return promise;
}

/**
 * 返回并格式化数据
 * @param type
 * @param xhr
 * @returns {*}
 */
function getResponseData(type, xhr) {
    switch (type) {
        case 'json':
            return JSON.parse(xhr.responseText);
        case 'xml':
            return xhr.responseXML;
        default:
            return xhr.responseText;
    }
}

/**
 * 设置HTTP header
 * 它应该包含在通过后续 send() 调用而发布的请求中。这个方法只有当 readyState 为 1 的时候才能调用，例如，在调用了 open() 之后，但在调用 send() 之前
 * @param xhr
 * @param opt
 */
function setRequestHeader(xhr, opt) {
    if (opt.headers) {
        for (var header in opt.headers) {
            xhr.setRequestHeader(header, opt.headers[header]);
        }
    }
}

exports.default = ajax;